package com.zf.common.http.entity;

import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;

/**
 * <pre>
 * 自定义资源文件类型：
 * 原因：
 * 1、直接使用 RestTemplate、RestClient、WebClient 发送请求时，要求 "multipart/form-data" 类型的请求表单中的文件类型必须是 {@link Resource} 接口的子类。
 *
 * 2、如果使用 "Http Interface" 方式发送请求，则 "multipart/form-data" 类型的请求表单中的文件类型可以是 {@link MultipartFile} 或 {@link Resource} 接口的子类
 * </pre>
 */
public class CustomByteArrayResource extends ByteArrayResource {
    private final String filename;

    public CustomByteArrayResource(byte[] contentByteArray, String filename) {
        super(contentByteArray);
        this.filename = filename;
    }

    /**
     * 如果不重写这个方法，并且文件有一定大小，那么服务端会出现异常
     */
    @Override
    public String getFilename() {
        return filename;
    }

    /**
     * 重写这个方法，RestTemplate、RestClient、WebClient 发送请求时会通过这个方法得到文件的大小。
     * 也可以不重写，父类的 contentLength() 的内容如下：
     * <pre>
     * 	  public long contentLength() {
     * 		return this.byteArray.length;
     *    }
     *
     * ByteArrayResource(contentByteArray) 构造会把 this.byteArray = contentByteArray,
     * 所以不用重写也可以获取到正确的文件大小
     * </pre>
     */
    @Override
    public long contentLength() {
        return getByteArray().length;
    }
}
